package cn.xenosp.server.common.scheduler;

import cn.xenosp.server.module.scheduler.logs.ConsoleLogCapture;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 项目名： service-web
 * 包路径： cn.xenosp.server.common.scheduler
 * 作者：   TongHui
 * 创建时间: 2025-11-25 14:03
 * 描述: TODO
 * 版本: 1.0
 */
public abstract class BaseSchedulerTask {
    protected ConsoleLogCapture logWrite;
    private String path;

    // 存储每个实现类的运行状态：key为实现类的Class对象，value为0（未运行）或1（运行中）
    private static final Map<Class<? extends BaseSchedulerTask>, Integer> RUNNING_FLAGS = new ConcurrentHashMap<>();

    public void setLogCapture(ConsoleLogCapture logCapture) {
        this.logWrite = logCapture;
        path =  this.getClass().getPackage().getName()+ "." +this.getClass().getSimpleName();
    }

    /**
     * 任务执行
     * @param logid  任务日志id，用于保存/获取任务日志
     * @param json   任务参数
     */
    public void execute(String logid, String json){
        // 获取当前实现类的Class对象（作为唯一标识）
        Class<? extends BaseSchedulerTask> clazz = this.getClass();
        // 检查当前实现类是否正在运行
        Integer currentFlag = RUNNING_FLAGS.getOrDefault(clazz, 0);
        if (currentFlag  != 0){
            writeLog(logid,"正在执行中");
            return;
        }
        try {
            // 标记为运行中
            RUNNING_FLAGS.put(clazz, 1);

            business( logid,  json);
        } catch (Exception e) {
            writeLog(logid,e.getMessage());
            throw new RuntimeException(e);
        }finally {
            // 无论成功失败，都标记为未运行
            RUNNING_FLAGS.put(clazz, 0);
            writeLog(logid,"");
        }
    }

    /**
     * 任务执行的业务逻辑 自定义实现
     * @param logid
     * @param json
     * @throws Exception
     */
    public abstract void business(String logid, String json) throws Exception;
    protected void writeLog(String logid,String message){
        logWrite.writeToBuffer(logid,path+" "+message);
    }
}
